package com.sunrise.configuracoes.servico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.configuracoes.repositorio.iface.FilialDao;
import com.sunrise.crm.repositorio.iface.CidadeDao;
import com.sunrise.crm.repositorio.iface.EnderecoDao;
import com.sunrise.crm.repositorio.iface.EstadoDao;
import com.sunrise.crm.repositorio.iface.UsuarioDao;
import com.sunrise.generico.entidade.Cidade;
import com.sunrise.generico.entidade.Endereco;
import com.sunrise.generico.entidade.Estado;
import com.sunrise.generico.entidade.Filial;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterFilialService {

	@Resource(name = "filialDaoImpl")
	@Getter
	private FilialDao filialDAO;

	@Resource(name = "usuarioDaoImpl")
	@Getter
	private UsuarioDao usuarioDAO;

	@Resource(name = "cidadeDaoImpl")
	@Getter
	private CidadeDao cidadeDAO;

	@Resource(name = "estadoDaoImpl")
	@Getter
	private EstadoDao estadoDAO;

	@Resource(name = "enderecoDaoImpl")
	@Getter
	private EnderecoDao enderecoDAO;

	public Collection<Filial> buscarPorFiltros(Filtro filial) {
		Collection<Filial> filiais = getFilialDAO().buscarPorFiltros(filial);
		for (Filial fil : filiais) {
			fil.getUsuarios().size();
		}

		return filiais;
	}

	public Collection<Usuario> listarUsuarioPorNome(String nome) {
		return getUsuarioDAO().listarPorNome(nome);
	}

	public List<Usuario> listarUsuariosPorFiltro(Filtro filtro) {
		return getUsuarioDAO().buscarPorFiltros(filtro);
	}

	public Collection<Usuario> adicionarUsuariosSelecionados(Usuario[] usuariosSelecionados, Filial filial) {
		Collection<Usuario> usuarios = new ArrayList<Usuario>();
		for (Usuario user : usuariosSelecionados) {
			Boolean inserido = false;
			if (!filial.getUsuarios().isEmpty()) {
				for (Usuario usuario : filial.getUsuarios()) {
					if (usuario.getId().equals(user.getId())) {
						inserido = true;
					}
				}
			}
			if (!inserido) {
				usuarios.add(user);
			}
		}

		return usuarios;
	}

	public Cidade buscarCidadePorNome(String cidade) {
		return getCidadeDAO().buscarPorNome(cidade);
	}

	public Collection<Estado> listarEstados() {
		return getEstadoDAO().listarOrdenado();
	}

	public Collection<Cidade> carregarCidadesPorEstado(Estado estado) {
		return getCidadeDAO().listarPorEstado(estado);
	}

	@Transactional(readOnly = false)
	public void inserir(Filial entidade) {
		entidade.setEndereco(inserirEndereco(entidade.getEndereco()));
		if(entidade.getUsuarios() != null && entidade.getUsuarios().isEmpty()){
			entidade.setUsuarios(null);
		}
		getFilialDAO().inserir(entidade);
	}

	private Endereco inserirEndereco(Endereco endereco) {
		if (endereco.getBairro() != null
				&& !endereco.getBairro().isEmpty()
				|| (endereco.getCep() != null && !endereco.getCep().isEmpty())
				|| (endereco.getCidade() != null && endereco.getCidade().getId() != null && endereco.getCidade()
						.getId() != 0) || (endereco.getComplemento() != null && !endereco.getComplemento().isEmpty())
				|| (endereco.getEndereco() != null && !endereco.getEndereco().isEmpty())) {
			getEnderecoDAO().inserir(endereco);
			return endereco;
		}
		return null;

	}

	public Collection<Filial> listarFiliaisOrdenado() {
		Collection<Filial> filiais = getFilialDAO().listarOrdenado();
		for (Filial filial : filiais) {
			filial.getUsuarios().size();
		}
		return filiais;
	}

	@Transactional(readOnly = false)
	public void alterar(Filial entidade) {
		if (entidade.getEndereco().getId() != null) {
			getEnderecoDAO().alterar(entidade.getEndereco());
		} else if (entidade.getEndereco().getBairro() != null && !entidade.getEndereco().getBairro().isEmpty()
				&& entidade.getEndereco().getCep() != null && !entidade.getEndereco().getCep().isEmpty()
				&& entidade.getEndereco().getCidade() != null && entidade.getEndereco().getCidade().getId() != null
				&& entidade.getEndereco().getEndereco() != null && !entidade.getEndereco().getEndereco().isEmpty()
				&& entidade.getEndereco().getComplemento() != null
				&& !entidade.getEndereco().getComplemento().isEmpty() && entidade.getEndereco().getNumero() != null
				&& !entidade.getEndereco().getNumero().isEmpty()) {
			getEnderecoDAO().inserir(entidade.getEndereco());
		} else {
			entidade.setEndereco(null);
		}
		getFilialDAO().alterar(entidade);

	}

	public Collection<Filial> listarFilialPorNome(String nome) {
		return getFilialDAO().listarPorNome(nome);
	}

	public Collection<Cidade> listarCidadePorNome(String nome) {
		return getCidadeDAO().listarPorNome(nome);
	}

}